package a05;

import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionCustomizer;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.GenericApplicationContext;

public class A05 {

    public static void main(String[] args) {
        GenericApplicationContext context = new GenericApplicationContext();
        context.registerBean(Config.class);
        //ConfigurationClassPostProcessor 会解析@ComponentScan @Bean @Import @ImportResource
        context.registerBean(ConfigurationClassPostProcessor.class);
        context.registerBean(MyComponentScanPostProcessor.class);

        /**
         * MapperScannerConfigurer也是一个BeanDefinitionRegistryPostProcessor后处理器。
         * ssm的@MapperScan注解、包括springboot继承mybatis，其实本质都是用他来去扫描Mapper的
         * bean。
         * 小节：可见，这些后处理器的扩展性很强，其他第三方框架也可以很好的去利用他们去实现一些bean的扫描
         * 功能，去方便的注册到spring中
         */
        context.registerBean(MapperScannerConfigurer.class, new BeanDefinitionCustomizer(){
            @Override
            public void customize(BeanDefinition bd) {
                //指定扫描的包
                bd.getPropertyValues().add("basePackage", "a05/mapper");
            }
        });

        context.refresh();  //会调用BeanFactory后处理器、Bean的初始化等
        for (String name : context.getBeanDefinitionNames()) {
            System.out.println(">>>" + name);
        }



    }
}
